package com.fengkai.filepost.pdfoutstream.test.ODsolutions;

import java.util.Stack;

/**
 * @author Fengkai
 * @creat 2023/4/11
 * 公司老板做了一笔大生意，想要给每位员工分配一些奖金，想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序，每个人随机抽取一个数字。按照工号的顺序往后排列，
 * 遇到第一个数字比自己数字大的，那么，前面的员工就可以获得“距离*数字差值”的奖金。如果遇不到比自己数字大的，就给自己分配随机数数量的奖金。例如，按照工号顺序的随机数字是
 * : 2,10.3。那么第2个员工的数字10比第1个员工的数字2大，所以，第1个员工可以获得1*(10-2) =8。第2个员工后面没有比他数字更大的员工，
 * 所以，他获得他分配的随机数数量的奖金，就是10。第3个员工是最后一个员工，后面也没有比他更大数字的员工，所以他得到的奖金是3。
 * 请帮老板计算一下每位员工最终分到的奖金都是多少钱
 * 输入描述:
 * 第一行n表示员工数量 (包含最后一个老板)
 * 第二是每位员工分配的随机数字
 * 例如
 * 3
 * 2 10 3
 * 输出描述:
 * 最终每位员工分到的奖金数量
 */
public class FindSalveMoney {


    public static void main (String[] args) {
        getMoney(new int[]{8, 6, 2, 19, 3});
        System.out.println(my(new int[]{8, 6, 2, 19, 3}));

    }

    public static String getMoney (int[] nums) {
        Stack<Integer> stack = new Stack<>();
        int res[] = new int[nums.length];
        int i = 0;
        while (i < nums.length) {
            if (stack.isEmpty() || nums[i] <= nums[stack.peek()]) {
                stack.push(i);
                i++;
            } else {
                res[stack.peek()] = (nums[i] - nums[stack.peek()]) * (i - stack.peek());
                stack.pop();
            }
        }
        while (!stack.isEmpty()) {
            res[stack.pop()] = -1;
        }

        for (int j = 0; j < nums.length; j++) {
            if (res[j] == -1) {
                System.out.print(nums[j]);
            } else {
                System.out.print(res[j]);
            }
            if (i != nums.length - 1) {
                System.out.print(" ");
            }
        }
        return null;
    }

    public static String my (int[] nums) {
        Stack<Integer> integerStack = new Stack<>();
        int length = nums.length;
        int result[] = new int[length];
        int i = 0;
        while (i < length) {
            //如果栈为空或者nums【栈顶】比num【i】小  就压入栈 一直循环
            if (integerStack.isEmpty() || nums[integerStack.peek()] >= nums[i]) {
                integerStack.push(i++);
            } else {
                //如果nums【栈顶】比num【i】大  说明找到了第一个比num【栈顶】大的数num【i】
                result[integerStack.peek()] = (nums[i] - nums[integerStack.peek()]) * (i - integerStack.peek());
                integerStack.pop();
            }
        }
        //如果栈不为空，说明该栈表示的坐标 右边没有比它大的值  将其设置为其本身
        while (!integerStack.isEmpty()) {
            result[integerStack.peek()] = nums[integerStack.pop()];
        }
        StringBuilder stringBuilder = new StringBuilder();
        for (int i1 : result) {
            stringBuilder.append(i1 + " ");
        }
        return stringBuilder.substring(0, stringBuilder.length() - 1);
    }
}
